<?php

/**
 * 安心站长axzz.cn，一个追求技术创造者。让网站、小程序、APP、应用程序牛起来……
 *
 * cighsen02 365182575
 *
 * Create at: 2021.08.01
 * Update at: 2025.11.24
 */

 // 指定加载目录
define('CLASS_DIR', [
    'twoir' => __DIR__
]);

/**
 * 配制文件加载,支持指定值加载
 *
 * 1. 整体（apiconfig）
 *
 * 2. 指定值（apiconfig.debug），支持多级
 */
class Config
{
    private string $path;

    /**
     * @param string $parameter
     * @return array
     *
     * @throws Exception
     */
    private function includeFile(string $parameter): array
    {
        // 文件是否存在
        if(!file_exists($file = $this->path . DIRECTORY_SEPARATOR . $parameter . '.php')) throw new Exception('配制' . $parameter . '.php文件不存在', 9401);

        return (require $file) ?? [];
    }

    /**
     * Summary of valuePointer
     *
     * @param string $parameter
     * @return object|array|string|int|bool|null
     */
    private function valuePointer(string $parameter)
    {
        $parts 	= explode('.', $parameter);
        $length = count($parts);
        $data 	= $this->includeFile($parts[0]);

        if ($length > 1) {

            for ($i = 1; $i < $length; $i++) {

                if (!isset($data[$parts[$i]])) {
                    $data[$parts[$i]] = $i === $length ? [] : null;
                }
                $data = &$data[$parts[$i]];
            }
        }

        return $data;
    }

    /**
     * 单个字符串，返回不带key
     *
     * @param string|array $parameters
     * @return object|array|string|int|bool|null
     */
    private function getConfig(string|array $parameters)
    {
        // 字符串时强转数组
        if(is_string($parameters)) {

            $key 		= $parameters;
            $parameters = [$parameters];
        }

        $parameters = array_flip($parameters);

        array_walk($parameters, fn(&$parameter, $key) => $parameter = $this->valuePointer($key));

        return isset($key) ? $parameters[$key] : $parameters;
    }

    /**
     * 静态调用方法
     *
     * @param string $name
     * @param array|string $parameters
     * @return array|null
     *
     * @throws Exception
     */
    public static function __callStatic(string $name, $parameters)
    {
        $definename = strtoupper($name);

        // 判断插件是否存在
        if(!isset(CLASS_DIR[$name])) throw new Exception('插件' . $definename . '不存在', 9200);

        $new = new static();
        $new->path = CLASS_DIR[$name] . DIRECTORY_SEPARATOR . 'config';

        return $new->getConfig(...$parameters);
    }
}

/**
 * 自加载类文件
 */
class Loader
{
    public static function autoload(string $class): void
    {
        // 不同操作系统 '/' 不一致问题
        $class = str_replace(['\\', '/'], DIRECTORY_SEPARATOR, $class);

        $pluginname = strstr($class, DIRECTORY_SEPARATOR, true);
        if(false === $pluginname) throw new Exception('请用命名空间实现自动加载', 9200);

        $pluginname = strtolower($pluginname);
        if(!isset(CLASS_DIR[$pluginname])) throw new Exception('插件' . $pluginname . '不存在', 9200);
        // 加载类文件
        include CLASS_DIR[$pluginname] . DIRECTORY_SEPARATOR . 'src' . strstr($class, DIRECTORY_SEPARATOR) . '.php';
    }
}

// 设置允许加载目录，允许多个目录
$classDir = implode(PATH_SEPARATOR, CLASS_DIR);
set_include_path($classDir);
spl_autoload_register([Loader::class, 'autoload']);

// 启动自定义错误抛出
new Twoir\ErrorHandler();

// 加载助手文件
require_once __DIR__ . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR . 'helper.php';
